import TauSimpleSelect from '@/components/TauSimpleSelect';
import * as BASE from '@/stores/definitions-base';
import { Input, NumberPicker, Switch, TimePicker2, Checkbox } from '@alifd/next';
import { t } from '@lingui/macro';
import React from 'react';
import dayjs from 'dayjs';

const {
  DATETIME_TEXT,
  DATE_TEXT,
  TIME_TEXT,
  EMPTY_TEXT,
  ENUMS: ENUMSBase,
  FieldsGrid: FieldGridBase,
  TitleGrid,
  column: columnBase,
  toSelectDataSource,
} = BASE;
export { DATETIME_TEXT, DATE_TEXT, EMPTY_TEXT, TIME_TEXT, TitleGrid, toSelectDataSource };

/**
 * @param {*} path        属性path
 * @param {*} props       column属性
 * @returns column定义
 */
export function column(...args) {
  return columnBase(model, ...args);
}

/**
 * 显示一组表单字段
 * ```js
 * {
 *   fields: string[],    // 字段名称，可以使用.来指定嵌套对象属性，例如order.busOrder.shift
 *   columns: number,     // 列数，默认为4,最大为12,最小为1
 *   model: object,       // 字段定义数据模型的根对象，默认不指定，仅在使用子对象作为根模型时设置
 *   overrideModel: object, // 重载字段定义数据模型
 *   mode: string,        // 表单模式，默认为edit，可选view
 *   itemLayout: object,  // FormItem布局配置，默认为{}
 * }
 * ```
 *
 * @param {object} param0
 * @returns
 */
export function FieldsGrid(props) {
  return <FieldGridBase model={model} {...props} />;
}

//----------------------------------------------------------------------
export const ENUMS = {
  ...ENUMSBase,
  // <br/> 1 - 流水班次<br/> 2 - 固定班次
  shiftType: {
    1: t`流水班次`,
    2: t`固定班次`,
  },
  state: {
    false: t`未执行`,
    true: t`已执行`,
  },
  enabled: {
    false: t`未启用`,
    true: t`已启用`,
  },
};

export const MAGIC_NUMBER = {
  // 专线班次类型
  SHIFT_TYPE: {
    // 普通类型
    NORMAL: 1,
    // 拼车类型
    CARPOOLING: 2,
  },
  // 拼车班次类型
  CARPOOLING_SHIFT_TYPE: {
    // 流水班次
    FLOW: '1',
    // 固定班次
    FIX: '2',
  },
};

/**
 * 模型定义：
 * 1. 普通文本仅需要定义label
 * 2. 需要通过枚举转换的值，定义text; 当使用renderer返回组件时，text属性无效，需要通过组件的renderPreview来指定预览时的绘制方式
 * 3. 通用的ui属性需要定制时，定义ui; 特定模式(view, edit, add)下的ui，添加后缀定义为ui_<mode>，例如：ui_view, ui_edit, ui_add, ui_table
 * 4. ui可配置属性包括:
 *    renderer: 内容渲染函数, Form表单中的原型为：(value: any, formData: any, fieldDefinition: any) => ReactNode; Table Column中的原型为: (value: any, columnIndex: number, rowData: any) => ReactNode;
 *    itemProps: 表单Form.Item的属性，可以是对象，或函数({ isPreview: boolean, mode: string, value: any, formData: any, ...otherDefinitions}) => void;
 *    span: Grid Cell占用的列数, 默认为1
 *
 * 【注】获取接口的model定义后，vscode中通过正则替换：^(\s+)"label": "([^']+)"  ===> $1label: t`$2`
 */
export const model = {
  startNames: {
    label: t`始发站点`,
  },
  endNames: {
    label: t`结束站点`,
  },
  id: {
    label: t`唯一id`,
  },
  type: {
    label: t`类型<br/> 1 - 普通类型<br/> 2 - 拼车类型`,
  },
  routePriceId: {
    label: t`线路价格id`,
  },
  state: {
    label: t`状态`,
    ui: {
      renderer: (v) => <Switch checked={v} unCheckedChildren={t`禁用`} checkedChildren={t`启用`} autoWidth size="small" />,
    },
  },
  shiftType: {
    label: t`班次类型`,
    ui: {
      renderer: (v) => <TauSimpleSelect data={toSelectDataSource(ENUMS.shiftType)} value={v} />,
      itemProps: { required: true },
    },
  },
  flowShifts: {
    label: t`流水班次设置信息`,
    firstTime: {
      label: t`首班车发车时间`,
      ui: {
        renderer: (v) => <TimePicker2 format="HH:mm" value={v} minuteStep={5} />,
        itemProps: { required: true },
      },
    },
    lastTime: {
      label: t`末班车发车时间`,
      ui: {
        renderer: (v) => <TimePicker2 format="HH:mm" value={v} minuteStep={5} />,
        itemProps: { required: true },
      },
    },
    interval: {
      label: t`间隔时间(分钟)`,
      ui: {
        renderer: (v) => <NumberPicker style={{ width: '30%' }} value={v} min={1} max={99} />,
        itemProps: { required: true },
      },
    },
    description: {
      label: t`说明`,
      ui: {
        renderer: (v) => <Input.TextArea value={v} />,
        span: 4,
      },
    },
    carpoolUnitPrice: {
      label: t`拼车单价`,
    },
    startCarpoolCount: {
      label: t`起拼人数`,
    },
  },
  fixedShifts: {
    label: t`固定班次设置信息`,
    description: {
      label: t`说明`,
      ui: {
        renderer: (v) => <Input.TextArea value={v} />,
        span: 4,
      },
    },
    scheduleItems: [{
      label: t`固定班次时间列表配置`,
      date: {
        label: t`固定班次时间点列表`,
      },
      carpoolUnitPrice: {
        label: t`拼车单价`,
      },
      startCarpoolCount: {
        label: t`起拼人数`,
      },
    }],
  },
  day: {
    label: t`生成的天数`,
    ui: {
      renderer: (v) => <NumberPicker style={{ width: '30%' }} value={v} min={1} max={99} />,
      itemProps: { required: true },
    },
  },
  ignoreDays: {
    label: t`忽略周期`,
    ui: {
      renderer: (v) => (
        <Checkbox.Group value={v}>
          <Checkbox value={1}>{t`星期一`}</Checkbox>
          <Checkbox value={2}>{t`星期二`}</Checkbox>
          <Checkbox value={3}>{t`星期三`}</Checkbox>
          <Checkbox value={4}>{t`星期四`}</Checkbox>
          <Checkbox value={5}>{t`星期五`}</Checkbox>
          <Checkbox value={6}>{t`星期六`}</Checkbox>
          <Checkbox value={7}>{t`星期日`}</Checkbox>
        </Checkbox.Group>),
      span: 3,
    },
  },
  realTimeUpdate: {
    label: t`是否实时更新`,
  },
  crBy: {
    label: t`创建者`,
  },
  upBy: {
    label: t`最后修改者`,
  },
  crDate: {
    label: t`创建时间`,
  },
  upDate: {
    label: t`最后修收时间`,
  },
  tenantId: {
    label: t`租户ID`,
  },

  payEndTime: {
    label: t`下单截止时间(无空位时/单位分)`,
    ui: {
      renderer: (v) => <NumberPicker style={{ width: '100%' }} value={v} min={0} max={9999} />,
    },
  },
  notGroupPayEndTime: {
    label: t`下单截止时间(有空位时/单位分)`,
    ui: {
      renderer: (v) => <NumberPicker style={{ width: '100%' }} value={v} min={0} max={9999} />,
    },
  },
};
